package inge_soft.gestoriusNuevo.business.service.implementation;

import inge_soft.gestoriusNuevo.business.service.abstraction.IProcesarSolicitudService;
import inge_soft.gestoriusNuevo.persistence.DAO.Exceptions.Abstraction.GestoriusException;
import inge_soft.gestoriusNuevo.persistence.DAO.abstraction.ISolicitudOrganizadorDAO;
import inge_soft.gestoriusNuevo.persistence.DAO.abstraction.ISolicitudOrganizadorLogDAO;
import inge_soft.gestoriusNuevo.persistence.DAO.abstraction.IUsuarioDAO;
import inge_soft.gestoriusNuevo.persistence.DAO.abstraction.IUsuarioRegistradoDAO;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.SolicitudOrganizador;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.SolicitudOrganizadorLog;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Usuario;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.UsuarioRegistrado;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service("procesarSolicitudService")
public class ProcesarSolicitudService implements IProcesarSolicitudService {
	
	@Autowired
	@Qualifier("solicitudOrganizadorDAO")
	ISolicitudOrganizadorDAO SolicitudOrganizadorDAO;
	
	@Autowired
	@Qualifier("solicitudOrganizadorLogDAO")
	ISolicitudOrganizadorLogDAO SolicitudOrganizadorLogDAO;
	
	@Autowired
	@Qualifier("usuarioDAO")
	IUsuarioDAO usuarioDAO;
	
	@Autowired
	@Qualifier("usuarioRegistradoDAO")
	IUsuarioRegistradoDAO usuarioRegistradoDAO;

	/**
	 * FIJARSE SI VALE LA PENA UNA CONSULTA DE SOLICITUDES POR USUARIO
	 */
	
	@Transactional
	public void nuevaSolicitudOrganizador(SolicitudOrganizador soliUsu, String nick)
			throws GestoriusException {
		UsuarioRegistrado userR = usuarioRegistradoDAO.findByNick(nick);
		
		Usuario usuarioBD = usuarioDAO.findById(userR.getUsuario().getId());
		//System.out.println(usuarioBD.getNombre());
		soliUsu.setUsuarioSolicitante(usuarioBD);
		
		SolicitudOrganizadorDAO.crear(soliUsu);
	}
	
	@Transactional
	public void nuevaSolicitudOrganizador(SolicitudOrganizador soliUsu)
			throws GestoriusException {	
		SolicitudOrganizadorDAO.crear(soliUsu);
	}

	@Transactional
	public void actualizarSolicitudOrganizador(SolicitudOrganizador soliUsu)
			throws GestoriusException {
		SolicitudOrganizadorDAO.modificar(soliUsu);
	}
	
	@Transactional
	public void crearSolicitudOrganizadorLog(SolicitudOrganizadorLog soliUsuL)
			throws GestoriusException {
		SolicitudOrganizadorLogDAO.crear(soliUsuL);
	}
	
	@Transactional
	public List<SolicitudOrganizadorLog> obtenerSolicitudesLog() throws DataAccessException{
		return SolicitudOrganizadorLogDAO.findAll();
	}
	
	@Transactional
	public SolicitudOrganizador obtenerSolicitud(Long idSol) throws DataAccessException{
		return SolicitudOrganizadorDAO.findById(idSol);
	}
	
	//@Transactional(noRollbackFor = DataAccessException.class)
	@Transactional
	public List<SolicitudOrganizador> obtenerSolicitudes() throws DataAccessException{
		return SolicitudOrganizadorDAO.findAll();
	}
	
	@Transactional
	public List<SolicitudOrganizador> obtenerSolicitudes(int estado) throws DataAccessException{
		return SolicitudOrganizadorDAO.findAll(estado);
	}

	@Transactional
	public List<SolicitudOrganizador> obtenerSolicitudesPorFechas(Date fechaInicio, Date fechaFinal) throws DataAccessException{
		return SolicitudOrganizadorDAO.findAll(fechaInicio, fechaFinal);
	}

	@Transactional
	public List<SolicitudOrganizador> obtenerSolicitudesPorFechas(int estado, Date fechaInicio, Date fechaFinal) throws DataAccessException{
		return SolicitudOrganizadorDAO.findAll(estado, fechaInicio, fechaFinal);
	}
	
	@Transactional
	public void cambiarRolUsuario(Usuario user, int rol) throws DataAccessException {
		UsuarioRegistrado userR = usuarioRegistradoDAO.findByUsuario(user);
		userR.setRol(rol);
		usuarioRegistradoDAO.modificarUsuario(userR);
	}

	public boolean tieneSolicitudPendiente(int estado, Usuario user) {
		return SolicitudOrganizadorDAO.tieneSolicitudPendiente(estado, user);
	}
	

}
